/* Soubor je ulozen v kodovani UTF-8.
 * Kontrola kódování: Příliš žluťoučký kůň úpěl ďábelské ódy. */

package cz.vse.adventura.po1715.cerj117_cermak.hra;

import cz.pecinovsky.english.pojj.adv_framework.game_gui.IBagG;
import cz.pecinovsky.english.pojj.adv_framework.game_gui.IListener;
import cz.pecinovsky.english.pojj.adv_framework.game_gui.IObjectG;
import cz.pecinovsky.english.pojj.adv_framework.game_txt.INamed;
import java.util.ArrayList;
import java.util.Collection;
import java.util.Collections;





/*******************************************************************************
 * Instance třídy {@code Batoh} představují úložiště, do nichž si hráči
 * odkládají sebrané předměty či jejch ekvivalenty.
 *
 * @author    Jiří Čermák
 * @version   1.00.000
 */
public class Batoh implements IBagG
{
//== KONSTANTNÍ ATRIBUTY TŘÍDY =================================================

    /** Maximální kapacita batohu - v této hře dvě ruce. */
    private static final int KAPACITA = 2;

     /** Schránka na přenášené předměty. V případě této hry se ale předměty
     *  přenášejí v rukou, a proto může hráč níst současně nejvýše dva. */
    private static final Batoh batoh = new Batoh();



//== PROMĚNNÉ ATRIBUTY TŘÍDY ===================================================
//== STATICKÝ INICIALIZAČNÍ BLOK - STATICKÝ KONSTRUKTOR ========================
//== KONSTANTNÍ ATRIBUTY INSTANCÍ ==============================================

    private final Collection<Předmět> obsah = new ArrayList<Předmět> ();

//== PROMĚNNÉ ATRIBUTY INSTANCÍ ================================================
//== PŘÍSTUPOVÉ METODY VLASTNOSTÍ TŘÍDY ========================================
//== OSTATNÍ NESOUKROMÉ METODY TŘÍDY ===========================================

//##############################################################################
//== KONSTRUKTORY A TOVÁRNÍ METODY =============================================

     static Batoh getBatoh()
    {
        return batoh;
    }



    /***************************************************************************
     * Vytvoří prázdný batoh.
     */
    private Batoh()
    {
        //Pro batoh stačí typicky implicitní konstruktor
    }



//== ABSTRAKTNÍ METODY =========================================================
//== PŘÍSTUPOVÉ METODY VLASTNOSTÍ INSTANCÍ =====================================

     /***************************************************************************
     * Vrátí kapacitu batohu, tj. kolik předmětů se do něj vejde.
     *
     * @return Kapacita batohu
     */
    @Override
    public int getCapacity()
    {
        return KAPACITA;
    }


    /***************************************************************************
     * Vrátí kolekci předmětů uložených v batohu.
     *
     * @return Kolekce předmětů v batohu
     */
    @Override
    public Collection<? extends IObjectG> getObjects()
    {
        return Collections.unmodifiableCollection(obsah);
    }


//== OSTATNÍ NESOUKROMÉ METODY INSTANCÍ ========================================
    
      /***************************************************************************
     * Zjistí, zda v je zadané kolekci pojmenovaný objekt se zadany nazvem
     * a vrátí jej.
     *
     * @param  nazev Nazev hledaného pojemnovaného objektu
     * @param  kolekce Kolekce, ve které pojmenovaný objekt hledám
     * @return Byl-li v kolekci objekt se zadaným názvem, vrati jej,
     *         jinak vrati prazdny odkaz {@code null}
     */
    public static INamed najdi(String nazev,
                               Collection<? extends INamed> kolekce)
    {
        nazev = nazev.toLowerCase();
        for (INamed ip : kolekce) {
            if (ip.getName().toLowerCase().equals(nazev)) {
                return ip;
            }
        }
        return null;
    }

    /***************************************************************************
     * Inicializuje jedináčka a připraví jej pro novou hru.
     */
    static void inicializuj()
    {
        batoh.obsah.clear();
    }


    /***************************************************************************
     * Zjistí, zda batoh obsahuje předmět zadaný svým názvem.
     *
     * @param  název Název předmětu v batohu
     * @return {@code true} pokud je předmět v batohu, jinak {@code falše}
     */
    boolean obsahuje( String název ) {
        Předmět nasel = (Předmět)najdi(název, obsah);
        return (nasel != null);
    }


    /***************************************************************************
     * Přidá zadaný předmět do batohu.
     *
     * @param  předmět Předmět přidávaný do batohu
     * @return {@code true} pokud byl předmět do batohu vložen
     */

    boolean přidej( Předmět předmět ) {
        boolean zvedám = (obsah.size() < KAPACITA)  &&  obsah.add( předmět );
        return zvedám;
    }


    /***************************************************************************
     * Vyjme z batohu předmět zadaný svým názvem.
     *
     * @param  název Název předmětu vybíraného z batohu
     * @return Byl-li předmět v batohu, vrátí odkaz na předmět,
     *         jinak vrátí prázdný odkaz {@code null}
     */
    Předmět vyjmi( String nazev ) {
        Předmět nasel = (Předmět)najdi(nazev, obsah);
        if (nasel != null) {
            obsah.remove(nasel);
        }
        return nasel;
    }


    /** {@inheritDoc} */
    @Override
    public String toString()  {
        return "Batoh obsahující " + obsah;
    }


    /***************************************************************************
     * Přidá zadaného posluchače do seznamu posluchačů,
     * které zpravuje o výskytu očekávané události.
     *
     * @param listener Přihlašovaný posluchač
     */
    @Override
    public void addListener(IListener<IBagG> listener) {
        throw new UnsupportedOperationException("Not supported yet.");
    }


     /***************************************************************************
     * Odebere zadaného posluchače do seznamu posluchačů,
     * které zpravuje o výskytu očekávané události.
     *
     * @param listener Odhlašovaný posluchač
     */
    @Override
    public void removeListener(IListener<IBagG> listener) {
        throw new UnsupportedOperationException("Not supported yet.");
    }

//== SOUKROMÉ A POMOCNÉ METODY TŘÍDY ===========================================
//== SOUKROMÉ A POMOCNÉ METODY INSTANCÍ ========================================
//== INTERNÍ DATOVÉ TYPY =======================================================
//== TESTOVACÍ METODY A TŘÍDY ==================================================
//
//     /***************************************************************************
//      * Testovací metoda.
//      */
//     public static void test()
//     {
//         Batoh instance = new Batoh();
//     }
//     /** @param args Parametry příkazového řádku - nepoužívané. */
//     public static void main(String[] args)  {  test();  }
}
